package org.me.data.impl;

import java.io.Serializable;
import java.util.List;
import org.me.data.GenericDaoHibernate;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class GenericDaoHibernateImpl extends HibernateDaoSupport  implements GenericDaoHibernate{

    //Graba o actualiza un entity x su Id, si el id es null Crea un nuevo registro de acuerdo ala Sequence Oracle, 
    //si se le pasa el id actualiza
    @Override
    public void saveOrUpdate(Object entity) {            
        this.getHibernateTemplate().saveOrUpdate(entity);           
    }   
    
    //Borra un entity x su Id
    @Override
    public String delete(Object entity) {
        try
        {
            this.getHibernateTemplate().delete(entity);
            return "ok";
        }
        catch(DataAccessException exec)        
        {
            return exec.getMessage();
        }      
        
    }
    
    //Trae todos los Objetos  sin ordenamiento     
    @Override
    public <T> List<T> find(Class<T> entityClass){
      List<T> entities = getHibernateTemplate().loadAll(entityClass);   
      
      return entities; 
      
    }
    
    //Trae los Objetos que coincidan con el criterio o parametro
    @Override
    public <T> List<T> findByCriterio( String namedQuery, String paramName, Object value) {
       //List<TPaises> resultado = this.getHibernateTemplate().findByNamedQuery("TPaises.findByVNombrePais", pais.getVNombrePais());// asi, si es que el @NamedQuery esta con ?
       List<T> objects = this.getHibernateTemplate().findByNamedQueryAndNamedParam(namedQuery, paramName, value);//("TPaises.findByVNombrePais", "vNombrePais", nomPais);
       
       return objects;
    }
    
    //Trae los Objetos que coincidan con los criterios o parametros
    @Override
    public <T> List<T> findByCriterio2( String namedQuery, String[] paramNames, Object[] values) {
       
       List<T> objects = this.getHibernateTemplate().findByNamedQueryAndNamedParam(namedQuery, paramNames, values );//("TPaises.findByVNombrePais", "vNombrePais", nomPais);
       
       return objects;
    }

    //Trae el Objeto que coincidan con el Id
    @Override    
    //public Object findById(Class entityClass, Serializable id) {
    public <T> T findById(Class<T> entityClass, Serializable id) {
        T entity = (T)this.getHibernateTemplate().get(entityClass, id);
        //T entity = (T)this.getHibernateTemplate().load(entityClass, id);
        return entity;
        //return this.getHibernateTemplate().get(entityClass, id);
    }   
    
    //Trae los Objetos segun el  NamedQuery  sin parametros
    @Override
    public <T> List<T> findByOnlyNamedQuery(String namedQuery) 
    {        
       List<T> objects = this.getHibernateTemplate().findByNamedQuery(namedQuery);
       
       return objects;
    }
    
}
